/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Controller;

import Model.Paciente;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;




/**
 *
 * @author Ramon
 */
public class PacienteDao {
    
 
    private static final PacienteDao INSTANCE = new PacienteDao();
    private ArrayList<Paciente> listaPaciente = new ArrayList<Paciente>();
    BancoDeDados bd = null;
    private int idGen = 0;
    public PacienteDao(){
       carregaLista();
    }
    
    public void carregaLista(){
        bd = new BancoDeDados();
        try {
            bd.conectar();
            bd.sql = "SELECT * FROM \"paciente\"";
            
            bd.comandoSql = bd.connection.prepareStatement(bd.sql);
            ResultSet rs  = bd.comandoSql.executeQuery();
            
            String nome;
            String cpf;
            int id_paciente = 0;
            String telefone;
            String email;
            char sexo;
            Date nascimento;
            Date cadastro;
            Date ultima_visita;
            Date proxima_visita;
            String rua;
            String cidade;
            String bairro;
            String estado;
            
            Paciente paciente;
            
            while(rs.next()){
                
                
                nome           = rs.getString(1);
                cpf            = rs.getString(2);
                id_paciente    = rs.getInt(3);
                telefone       = rs.getString(4);
                email          = rs.getString(5);
                sexo           = (char)rs.getCharacterStream(6).read();
                nascimento     = rs.getDate(7);
                cadastro       = rs.getDate(8);
                ultima_visita  = rs.getDate(9);
                proxima_visita = rs.getDate(10);
                rua            = rs.getString(11);
                cidade         = rs.getString(12);
                bairro         = rs.getString(13);
                estado         = rs.getString(14);
            
                
             
              
              paciente    = new Paciente(nome, cpf, id_paciente, telefone, email, sexo, nascimento, cadastro, ultima_visita, proxima_visita, rua, cidade, bairro ,estado);
              
              listaPaciente.add(paciente);           
            }
            setIdGen(id_paciente);
            
            bd.desconectar();
        } catch (Exception ex) {
            Logger.getLogger(PacienteDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }     

    public int getIdGen() {
        return idGen;
    }

    public void setIdGen(int idGen) {
        this.idGen = idGen;
    }
    
    
     
    public void inserePaciente(String nome, String cpf, int id, String telefone, String email, char sexo, Date nascimento, Date cadastro,  Date ultimaVisita, Date proximaVisita, String rua, String cidade, String bairro,  String estado, int numero){
        bd = new BancoDeDados();
        setIdGen(getIdGen()+1);
        try {
            bd.conectar();
            bd.sql = "INSERT INTO \"paciente\" VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
            bd.comandoSql = bd.connection.prepareStatement(bd.sql);
            bd.comandoSql.setString(1, nome);
            bd.comandoSql.setString(2, cpf);
            bd.comandoSql.setInt(3,getIdGen());
            bd.comandoSql.setString(4, telefone);
            bd.comandoSql.setString(5, email);
            bd.comandoSql.setString(6, String.valueOf(sexo));
            bd.comandoSql.setDate(7,nascimento);
            bd.comandoSql.setDate(8,cadastro);
            bd.comandoSql.setDate(9,ultimaVisita);
            bd.comandoSql.setDate(10,proximaVisita);
            bd.comandoSql.setString(11,rua);
            bd.comandoSql.setString(12,cidade);
            bd.comandoSql.setString(13,bairro);
            bd.comandoSql.setString(14,estado);
            bd.comandoSql.setInt(15,numero);
            
            
            bd.comandoSql.executeUpdate();
            
            listaPaciente.add(new Paciente(nome, cpf, id, telefone, email, sexo, nascimento, cadastro, ultimaVisita, proximaVisita, rua, cidade, bairro, estado ));
            setIdGen(idGen+1);
        } catch (Exception ex) {
            Logger.getLogger(PacienteDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
     
     
    public static PacienteDao getINSTANCE() {
        return INSTANCE;
    }

    public ArrayList<Paciente> getListaPaciente() {
        return listaPaciente;
    }

    public Paciente findById(int id) {
        for(Paciente paciente : listaPaciente)
            if(paciente.getId() == id)
                return paciente;
        return null;
    }
    
    public Paciente findByNome(String nome) {
        for(Paciente paciente : listaPaciente)
            if(paciente.getNome().equals(nome))
                return paciente;
        return null;
    }

    public void atualizaPaciente(String nome, String cpf, int id, String telefone, String email, char sexo, Date nascimento, Date cadastro,  Date ultimaVisita, Date proximaVisita, String rua, String cidade, String bairro,  String estado, int idVelho ){
       
        bd = new BancoDeDados();
        try {
            bd.conectar();
            bd.sql = "UPDATE \"paciente\" SET  \"Nome\" = ?, \"Cpf\" = ?, \"Id_paciente\" = ?, \"Telefone\" = ?, \"Email\" = ?, "
                     +"\"Sexo\" = ?, \"Nascimento\" = ?, \"Cadastro\"= ?, \"Ultima_visita\"= ?, \"Proxima_visita\"= ?, \"Rua\"= ?, \"Cidade\"= ?, "
                     +"\"Bairro\"= ?, \"Estado\"= ?  WHERE \"Id_paciente\" = ?";
            bd.comandoSql = bd.connection.prepareStatement(bd.sql);
            bd.comandoSql.setString(1, nome);
            bd.comandoSql.setString(2, cpf);
            bd.comandoSql.setInt(3, id);
            bd.comandoSql.setString(4, telefone);
            bd.comandoSql.setString(5, email);
            bd.comandoSql.setString(6, String.valueOf(sexo));
            bd.comandoSql.setDate(7, nascimento);
            bd.comandoSql.setDate(8, cadastro);
            bd.comandoSql.setDate(9, ultimaVisita);
            bd.comandoSql.setDate(10, proximaVisita);
            bd.comandoSql.setString(11, rua);
            bd.comandoSql.setString(12, cidade);
            bd.comandoSql.setString(13, bairro);
            bd.comandoSql.setString(14, estado);
            bd.comandoSql.setInt(15, idVelho);
            
            
            bd.comandoSql.executeUpdate();
            
            listaPaciente.remove(findById(idVelho));
            
            Paciente paciente = new Paciente(nome, cpf, id, telefone, email, sexo, nascimento, cadastro, ultimaVisita, proximaVisita, rua, cidade, bairro, estado);
                            
            listaPaciente.add(paciente);
            
        } catch (Exception ex) {
            Logger.getLogger(PacienteDao.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    }

    public void excluirPaciente(int id) {
        bd = new BancoDeDados();
        try {
            bd.conectar();
            bd.sql = "DELETE FROM \"paciente\" WHERE \"Id_paciente\" = ?";
            bd.comandoSql = bd.connection.prepareStatement(bd.sql);
            bd.comandoSql.setInt(1, id);
            bd.comandoSql.executeUpdate();
            
            listaPaciente.remove(findById(id));
            
        } catch (Exception ex) {
            Logger.getLogger(PacienteDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void excluirPacienteNome(String nome) {
        bd = new BancoDeDados();
        try {
            bd.conectar();
            bd.sql = "DELETE FROM \"paciente\" WHERE \"Nome\" = ?";
            bd.comandoSql = bd.connection.prepareStatement(bd.sql);
            bd.comandoSql.setString(1, nome);
            bd.comandoSql.executeUpdate();
            
            listaPaciente.remove(findByNome(nome));
            
        } catch (Exception ex) {
            Logger.getLogger(PacienteDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
   

    

    /*public ArrayList<Animal> getListaAnimal(Cliente c) {
        ArrayList<Animal> animalCliente = new ArrayList<Animal>();
        for(Animal animal : listaAnimal){
            if(animal.getCliente().getId_Cliente() == c.getId_Cliente())
                animalCliente.add(animal);
        }
        
     return animalCliente;
    }*/
     
    
     
     
     
     
}

    

